package com.example.demo6copy;

import java.io.*;

/**
 * 目标：掌握资源的新方式：try-with-resource
 */
public class CopyDemo2 {
    public static void main(String[] args) {
        // 源文件：D:\File\Test\123.jpg
        // 目标文件：D:\File 注意：(复制过去的时候必须带文件名的，无法自动生成文件名)
        copyFile("D:\\File\\Test\\123.jpg", "D:\\File\\123.jpg");
    }

    /**
     * 复制文件
     * @param srcPath 源文件路径
     * @param destPath 目标文件路径
     */
    public static void copyFile(String srcPath, String destPath) {
        /*
        由于上一种关闭的方式过于麻烦，所以jdk7开始提供了更简单的资源释放方案：try-with-resource
        try(定义资源1 , 定义资源2 ){

        }
        最后在资源使用完毕的适合会自动的调用close方法
         */
        // 1.创建一个文件字节输入流管道与源文件接通
        try (
                // 什么是资源呢?
                // 资源一般指的是最终实现了AutoCloseable接口
                // 注意：这里只能放置资源对象，用完后，最终会自动调用其close方法关闭！！
                InputStream fis = new FileInputStream(srcPath);
                OutputStream fos = new FileOutputStream(destPath);
                MyConn conn = new MyConn(); // 自定义的资源对象 最终会自动调用其close方法关闭！！
        ) {
            // 2.读取一个字节数组，写入一个字节数组  1024 + 1024 + 3
            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, len); // 读取多少个字节，就写入多少个字节
            }
            System.out.println("复制成功！");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class MyConn implements Closeable {
    @Override
    public void close() throws IOException {
        System.out.println("yu的资源关闭了！");
    }
}
